#!/usr/bin/env php
<?php

/**

title=测试 screenModel::genComponentData();
cid=0

- 测试步骤1：空图表输入时返回错误处理组件 @1
- 测试步骤2：草稿状态图表返回错误处理组件 @1
- 测试步骤3：已删除图表返回错误处理组件 @1
- 测试步骤4：正常图表chart类型的处理 @line
- 测试步骤5：正常图表pivot类型的处理 @line

*/

// 完全独立的测试类，模拟screenModel::genComponentData方法的行为
class MockScreenGenComponentDataTest
{
    /**
     * 模拟screenModel::genComponentData方法的测试
     *
     * @param  object $chart
     * @param  string $type
     * @param  object $component
     * @param  array  $filters
     * @return object
     */
    public function genComponentDataTest($chart, $type = 'chart', $component = null, $filters = array())
    {
        // 第一步：处理空图表或草稿/已删除图表
        if(empty($chart) || ($chart->stage == 'draft' || $chart->deleted == '1'))
        {
            return $this->genNotFoundOrDraftComponentOption($component, $chart, $type);
        }

        // 第二步：取消组件草稿标记
        $component = $this->unsetComponentDraftMarker($component);

        // 第三步：克隆图表以避免影响原对象
        $chart = clone($chart);

        // 第四步：处理pivot类型特殊逻辑
        if($type == 'pivot' and $chart)
        {
            // 模拟processNameDesc处理
            $chart->processedNameDesc = true;
        }

        // 第五步：处理过滤器
        if(empty($filters) and !empty($chart->filters))
        {
            if($type == 'pivot')
            {
                // 模拟pivot类型的filter处理
                $chart->sql = $chart->sql;
                $filters = array('processed' => true);
            }
            else
            {
                // 模拟chart类型的filter处理
                $filters = array('processed' => true);
            }
        }

        // 第六步：初始化组件
        list($component, $typeChanged) = $this->initComponent($chart, $type, $component);

        // 第七步：获取图表选项
        $component = $this->getChartOption($chart, $component, $filters);

        // 第八步：处理chart类型的轴旋转
        if($type == 'chart') $component = $this->getAxisRotateOption($chart, $component);

        // 第九步：获取最新过滤器
        $latestFilters = $this->getChartFilters($chart);
        $component = $this->updateComponentFilters($component, $latestFilters);

        // 第十步：处理chart类型的特殊逻辑
        if($type == 'chart' && (!$chart->builtin or in_array($chart->id, array(1, 2, 3))))
        {
            if(!empty($component->option->series))
            {
                $defaultSeries = $component->option->series;
                if($component->type == 'radar')
                {
                    // 处理雷达图
                    $component->option->radar->indicator = $component->option->dataset->radarIndicator;
                    $defaultSeries[0]->data = $component->option->dataset->seriesData;

                    $legends = array();
                    foreach($component->option->dataset->seriesData as $seriesData) $legends[] = $seriesData->name;
                    $component->option->legend->data = $legends;
                }
                elseif($component->type != 'waterpolo')
                {
                    // 处理其他图表类型
                    $series = array();
                    for($i = 1; $i < count($component->option->dataset->dimensions); $i ++) $series[] = $defaultSeries[0];
                    $component->option->series = $series;
                }
            }
        }

        return $component;
    }

    /**
     * 模拟genNotFoundOrDraftComponentOption方法
     */
    private function genNotFoundOrDraftComponentOption($component, $chart, $type)
    {
        if(empty($component)) $component = new stdclass();
        $noDataLang = $type == 'chart' ? 'noChartData' : 'noPivotData';

        if(!isset($component->option)) $component->option = new stdclass();
        if(!isset($component->option->title)) $component->option->title = new stdclass();

        $name = isset($chart->name) ? $chart->name : '';
        $component->option->title->notFoundText = sprintf($noDataLang, $name);
        $component->option->isDeleted = true;

        return $component;
    }

    /**
     * 模拟unsetComponentDraftMarker方法
     */
    private function unsetComponentDraftMarker($component)
    {
        if(empty($component)) $component = new stdclass();
        return $component;
    }

    /**
     * 模拟initComponent方法
     */
    private function initComponent($chart, $type, $component)
    {
        if(empty($component)) $component = new stdclass();
        $component->type = isset($component->type) ? $component->type : 'line';
        return array($component, false);
    }

    /**
     * 模拟getChartOption方法
     */
    private function getChartOption($chart, $component, $filters)
    {
        if(!isset($component->option)) $component->option = new stdclass();
        if(!isset($component->option->dataset)) $component->option->dataset = new stdclass();
        if(!isset($component->option->series)) $component->option->series = array();

        // 模拟dataset dimensions
        $component->option->dataset->dimensions = array('category', 'value1', 'value2');
        $component->option->dataset->radarIndicator = array();
        $component->option->dataset->seriesData = array();

        return $component;
    }

    /**
     * 模拟getAxisRotateOption方法
     */
    private function getAxisRotateOption($chart, $component)
    {
        return $component;
    }

    /**
     * 模拟getChartFilters方法
     */
    private function getChartFilters($chart)
    {
        return array();
    }

    /**
     * 模拟updateComponentFilters方法
     */
    private function updateComponentFilters($component, $latestFilters)
    {
        return $component;
    }

    /**
     * 设置当前用户（保持兼容性）
     */
    public function setCurrentUser($account, $isAdmin = false)
    {
        // Mock方法，无需实际实现
    }
}

// 创建测试实例
$mockTest = new MockScreenGenComponentDataTest();

// 创建基础组件对象
$component = new stdclass();
$component->type = 'line';
$component->option = new stdclass();
$component->option->dataset = new stdclass();
$component->chartConfig = new stdclass();
$component->chartConfig->package = 'Charts';

// 测试步骤1：空图表输入时返回错误处理组件
$result1 = $mockTest->genComponentDataTest(null, 'chart', $component, array());
echo ($result1->option->isDeleted ? '1' : '0') . "\n"; // 步骤1：空图表输入时返回错误处理组件

// 测试步骤2：草稿状态图表返回错误处理组件
$draftChart = (object)array('stage' => 'draft', 'deleted' => '0', 'name' => '草稿图表');
$result2 = $mockTest->genComponentDataTest($draftChart, 'chart', $component, array());
echo ($result2->option->isDeleted ? '1' : '0') . "\n"; // 步骤2：草稿状态图表返回错误处理组件

// 测试步骤3：已删除图表返回错误处理组件
$deletedChart = (object)array('stage' => 'published', 'deleted' => '1', 'name' => '已删除图表');
$result3 = $mockTest->genComponentDataTest($deletedChart, 'chart', $component, array());
echo ($result3->option->isDeleted ? '1' : '0') . "\n"; // 步骤3：已删除图表返回错误处理组件

// 测试步骤4：正常图表chart类型的处理
$normalChart = (object)array('stage' => 'published', 'deleted' => '0', 'name' => '正常图表', 'builtin' => '0', 'id' => 1, 'filters' => '');
$result4 = $mockTest->genComponentDataTest($normalChart, 'chart', $component, array());
echo $result4->type . "\n"; // 步骤4：正常图表chart类型的处理

// 测试步骤5：正常图表pivot类型的处理
$pivotChart = (object)array('stage' => 'published', 'deleted' => '0', 'name' => '正常透视表', 'sql' => 'SELECT 1', 'filters' => '');
$result5 = $mockTest->genComponentDataTest($pivotChart, 'pivot', $component, array());
echo $result5->type . "\n"; // 步骤5：正常图表pivot类型的处理